package br.com.hs.nfe.common.app;

import br.com.hs.nfe.common.exception.HSCommonException;
import br.com.hs.nfe.common.util.HSConstants;
import br.com.hs.nfe.common.util.HSMessageConstants;
import br.com.hs.nfe.common.enumeration.ConfigEnum;
import br.com.hs.nfe.common.enumeration.TipoAmbienteEnum;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.text.MessageFormat;
import java.util.Properties;

/**
 * Classe de Configurações do Aplicativo.
 * @author Ranlive Hrysyk
 */
public class AppConfig {

    private static AppConfig appConfig;
    private Properties properties;

    /**
     * Obtém a instância de AppConfig.
     * @return AppConfig
     */
    public static AppConfig getInstance() throws HSCommonException {
        if (appConfig == null) {
            appConfig = new AppConfig();
        }
        return appConfig;
    }

    private AppConfig() throws HSCommonException {
        try {
            properties = new Properties();
            properties.load(new FileInputStream(HSConstants.APP_DIRECTORY_CONFIG + File.separator + HSConstants.APP_ARQUIVO_CONFIG));
        } catch (IOException ex) {
            throw new HSCommonException(MessageFormat.format(HSMessageConstants.MSG_FILE_NOT_FOUND, new Object[]{HSConstants.APP_ARQUIVO_CONFIG, HSConstants.APP_DIRECTORY_CONFIG}));
        }
    }

    /**
     * Obtém o código do tipo de ambiente.
     */
    public String getTipoAmbiente() {
        return properties.getProperty(ConfigEnum.APLICATIVO_AMBIENTE.getKey());
    }

    /**
     * Obtém a versão do aplicativo.
     */
    public String getVersaoAplicativo() {
        return properties.getProperty(ConfigEnum.APLICATIVO_VERSAO.getKey());
    }

    /**
     * Obtém a versão do schema XML.
     */
    public String getVersaoSchema() {
        return properties.getProperty(ConfigEnum.SCHEMA_VERSAO.getKey());
    }

    /**
     * Obtém o nome do arquivo da cadeia de certificado.
     */
    public String getArquivoTrustStore() {
        return getTipoAmbiente().equals(TipoAmbienteEnum.PRODUCAO.getCodigo()) ? properties.getProperty(ConfigEnum.ARQUIVO_TRUSTSTORE_PRODUCAO.getKey()) : properties.getProperty(ConfigEnum.ARQUIVO_TRUSTSTORE_HOMOLOGACAO.getKey());
    }

    /**
     * Obtém o nome do arquivo de url dos serviços da Sefaz.
     */
    public String getArquivoURLSefaz() {
        return getTipoAmbiente().equals(TipoAmbienteEnum.PRODUCAO.getCodigo()) ? properties.getProperty(ConfigEnum.ARQUIVO_SEFAZ_URL_PRODUCAO.getKey()) : properties.getProperty(ConfigEnum.ARQUIVO_SEFAZ_URL_HOMOLOGACAO.getKey());
    }

    /**
     * Obtém a versão do schema de consulta recibo.
     */
    public String getVersaoSchemaConsRecibo() {
        return properties.getProperty(ConfigEnum.SCHEMA_VERSAO_CONS_RECIBO.getKey());
    }

    /**
     * Obtém a versão do schema de cancelamento.
     */
    public String getVersaoSchemaCancelamento() {
        return properties.getProperty(ConfigEnum.SCHEMA_VERSAO_CANCELAMENTO.getKey());
    }

    /**
     * Obtém a versão do scchema de inutilização.
     */
    public String getVersaoSchemaInutilizacao() {
        return properties.getProperty(ConfigEnum.SCHEMA_VERSAO_INUTILIZACAO.getKey());
    }

    /**
     * Obtém a versão do schema de envio da NF-e.
     */
    public String getVersaoSchemaEnvioNFe() {
        return properties.getProperty(ConfigEnum.SCHEMA_VERSAO_ENVIO_NFE.getKey());
    }

    /**
     * Obtém a versão do schema da consulta de status do serviço.
     */
    public String getVersaoSchemaStatusServico() {
        return properties.getProperty(ConfigEnum.SCHEMA_VERSAO_CONS_STATUS_SERVICO.getKey());
    }

    /**
     * Obtém a versão do schema da consulta da situação.
     */
    public String getVersaoSchemaConsultaSituacao() {
        return properties.getProperty(ConfigEnum.SCHEMA_VERSAO_CONS_SITUACAO.getKey());
    }

    /**
     * Obtém a versão do schema do DPEC.
     */
    public String getVersaoSchemaDPEC() {
        return properties.getProperty(ConfigEnum.SCHEMA_VERSAO_DPEC.getKey());
    }

    /**
     * Obtém a versão do schema da consulta de cadastro.
     */
    public String getVersaoSchemaConsultaCadastro() {
        return properties.getProperty(ConfigEnum.SCHEMA_VERSAO_CONS_CADASTRO.getKey());
    }

    /**
     * Obtém a URL de envio do DPEC.
     */
    public String getUrlDPECEnvio() {
        return properties.getProperty(ConfigEnum.URL_DPEC_ENVIO.getKey());
    }

    /**
     * Obtém a URL de consulta do DPEC.
     */
    public String getUrlDPECConsulta() {
        return properties.getProperty(ConfigEnum.URL_DPEC_CONSULTA.getKey());
    }
}
